ASP.NET. MVC2. Entity Framework. Cannot pass primary key value back from view to [HttpPost]

Posted by Paul Connolly on Stack Overflow See other posts from Stack Overflow or by Paul Connolly
Published on 2010-05-10T07:06:49Z Indexed on 2010/05/10 7:14 UTC
Read the original article Hit count: 822

I pass a ViewModel (which contains a "Person" object) from the "EditPerson" controller action into the view. When posted back from the view, the ActionResult receives all of the Person properties except the ID (which it says is zero instead of say its real integer)

Can anyone tell me why?

The controllers look like this:

        public ActionResult EditPerson(int personID)
    {          
        var personToEdit = repository.GetPerson(personID);

        FormationViewModel vm = new FormationViewModel();

        vm.Person = personToEdit;

        return View(vm);
    }

    [HttpPost]
    public ActionResult EditPerson(FormationViewModel model) <<Passes in all properties except ID
    {
      // Persistence code
    }

The View looks like this:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Afp.Models.Formation.FormationViewModel>" %>

<% using (Html.BeginForm()) {%> <%= Html.ValidationSummary(true) %>

    <fieldset>
        <legend>Fields</legend>


        <div class="editor-label">
            <%= Html.LabelFor(model => model.Person.Title) %>
        </div>

        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Person.Title) %>
            <%= Html.ValidationMessageFor(model => model.Person.Title) %>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.Person.Forename)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Person.Forename)%>
            <%= Html.ValidationMessageFor(model => model.Person.Forename)%>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.Person.Surname)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Person.Surname)%>
            <%= Html.ValidationMessageFor(model => model.Person.Surname)%>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.DOB) %>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.DOB, String.Format("{0:g}", Model.DOB))
            <%= Html.ValidationMessageFor(model => model.DOB) %>
        </div>--%>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.Person.Nationality)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Person.Nationality)%>
            <%= Html.ValidationMessageFor(model => model.Person.Nationality)%>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.Person.Occupation)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Person.Occupation)%>
            <%= Html.ValidationMessageFor(model => model.Person.Occupation)%>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.Person.CountryOfResidence)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Person.CountryOfResidence)%>
            <%= Html.ValidationMessageFor(model => model.Person.CountryOfResidence)%>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.Person.PreviousNameForename)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Person.PreviousNameForename)%>
            <%= Html.ValidationMessageFor(model => model.Person.PreviousNameForename)%>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.Person.PreviousSurname)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Person.PreviousSurname)%>
            <%= Html.ValidationMessageFor(model => model.Person.PreviousSurname)%>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.Person.Email)%>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.Person.Email)%>
            <%= Html.ValidationMessageFor(model => model.Person.Email)%>
        </div>

        <p>

            <input type="submit" value="Save" />

        </p>
    </fieldset>

<% } %>

And the Person class looks like:

[MetadataType(typeof(Person_Validation))]
public partial class Person
{
    public Person()
    {
    }
}

[Bind(Exclude = "ID")]
public class Person_Validation
{
    public int ID { get; private set; }
    public string Title { get; set; }
    public string Forename { get; set; }
    public string Surname { get; set; }
    public System.DateTime DOB { get; set; }
    public string Nationality { get; set; }
    public string Occupation { get; set; }
    public string CountryOfResidence { get; set; }
    public string PreviousNameForename { get; set; }
    public string PreviousSurname { get; set; }
    public string Email { get; set; }
}

And ViewModel:

public class FormationViewModel
{

    public Company Company { get; set; }

    public Address RegisteredAddress { get; set; }

    public Person Person { get; set; }

    public PersonType PersonType { get; set; }

   public int CurrentStep { get; set; }
}

}

© Stack Overflow or respective owner

Related posts about asp.net-mvc

Related posts about entity-framework